package utils

import (
	"math/rand"
	"strconv"
	"strings"
	"sync/atomic"
	"time"

	"github.com/google/uuid"
)

func GenerateUUID() string {
	newUUID, _ := uuid.NewUUID()
	return strings.Replace(newUUID.String(), "-", "", -1)
}

var seed int64

// MakeOrderNum 生成一个唯一的订单号
// 该函数没有参数
// 返回值: string - 生成的订单号，格式为 "日期时间+时间戳微秒后4位+自增序列"
func MakeOrderNum() string {
	// 基于原子操作自增全局seed变量，保证并发安全
	s := atomic.AddInt64(&seed, 1)
	// 获取当前时间，并格式化为 "20060102150405" 格式
	a := time.Now().In(ShLocation).Format("20060102150405")
	// 获取当前时间的Unix微秒，并转换为字符串
	b := strconv.Itoa(int(time.Now().In(ShLocation).UnixMicro()))
	// 取字符串b的最后4位，减少生成的订单号长度
	b = b[len(b)-4:]
	// 将自增的seed转换为字符串
	c := strconv.Itoa(int(s))

	// 将日期时间、时间戳后4位和自增序列拼接为订单号
	return a + b + c
}

// 随机字符串
func RandomString(l int) string {
	str := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	bytes := []byte(str)
	result := []byte{}
	for i := 0; i < l; i++ {
		result = append(result, bytes[RandomInt(0, len(bytes))])
	}
	return string(result)
}

// 随机数字字符串
func RandomNumberString(l int) string {
	str := "0123456789"
	bytes := []byte(str)
	result := []byte{}
	for i := 0; i < l; i++ {
		result = append(result, bytes[RandomInt(0, len(bytes))])
	}
	return string(result)
}

// 随机整数
func RandomInt(min, max int) int {
	return min + rand.Intn(max-min)
}
